<?php
    // Redis支持五种数据类型：string（字符串），hash（哈希），list（列表），set（集合）及zset(sorted set：有序集合)。



    
    function echoln($s){
     echo $s;
     echo "\n";
    }

    function dd($s){
     var_dump($s);
     echo "\n";
    }

    // ============================
    // @1 connect auth ping
    // 描述：实例连接到一个Redis.
    // 参数：host: string，port: int
    // 返回值：BOOL 成功返回：TRUE;失败返回：FALSE
    // ============================
    $redis = new Redis();
    $connect_result = $redis->connect('127.0.0.1', 6379);
    echo $connect_result; //bool(true/false)
    $redis->auth('ding1993');//登录密码 （如果有密码）
    echoln($redis->ping());//+PONG
    echo "Server is running: " . $redis->ping()."\n";
    $redis -> flushAll();



//单个变量

    // ==============================================================================
    // @2 set
    // 描述：设置key和value的值
    // 参数：Key Value
    // 返回值：BOOL 成功返回：TRUE;失败返回：FALSE
    // ==============================================================================
    $redis->set('name','cding');

    // ==============================================================================
    // @3 get
    // 描述：获取有关指定键的值
    // 参数：key
    // 返回值：string或BOOL 如果键不存在，则返回 FALSE。否则，返回指定键对应的value值。
    // ==============================================================================
    echoln($redis->get('name'));//cding

    // ==============================================================================
    // @4 delete
    // 描述：删除指定的键
    // 参数：一个键，或不确定数目的参数，每一个关键的数组：key1 key2 key3 … keyN
    // 返回值：删除的项数
    // ==============================================================================
    echoln($redis->delete('name'));

    // ==============================================================================
    // @5 exists
    // 描述：验证指定的键是否存在
    // 参数key
    // 返回值：Bool 成功返回：TRUE;失败返回：FALSE
    // ==============================================================================
    echoln($redis->exists('name'));//false

    // ==============================================================================
    // @6 incr
    // 描述：数字递增存储键值键.
    // 参数：key value：将被添加到键的值
    // 返回值：INT the new value
    // ==============================================================================
    $redis->set('num','100');
    echoln($redis->incr('num'));//101

    // ==============================================================================
    // @7 decr
    // 描述：数字递减存储键值。
    // 参数：key value：将被添加到键的值
    // 返回值：INT the new value
    // ==============================================================================
    echoln($redis->decr('num'));//100

    // ==============================================================================
    // @8 getMultiple
    // 描述：取得所有指定键的值。如果一个或多个键不存在，该数组中该键的值为假
    // 参数：其中包含键值的列表数组
    // 返回值：返回包含所有键的值的数组
    // ==============================================================================
    dd($redis->getMultiple(array('test1','test2')));  //结果：Array ( [0] => 1 [1] => 2 )

















//列表 就类似php中的数组,键是唯一的,从0开始到1,2,3 .....-2,-1  0是第一个元素键，-1是最后一个元素键

    // 列表==============================================================================
    // @9 lpush lpushx(若键不存在则不进行操作)
    // 描述：由列表头部添加字符串值。如果不存在该键则创建该列表。如果该键存在，而且不是一个列表，返回FALSE。
    // 参数：key,value
    // 返回值：成功返回数组长度，失败false
    // ==============================================================================
    $redis->delete('list1');
    $redis->lpush('list1','1');
    $redis->lpush('list1','2','3','1');
    dd($redis->lgetrange('list1','0','-1'));

    // 列表==============================================================================
    // @10 rpush rpushx(若键不存在则不进行操作)
    // 描述：由列表尾部添加字符串值。如果不存在该键则创建该列表。如果该键存在，而且不是一个列表，返回FALSE。
    // 参数：key,value
    // 返回值：成功返回数组长度，失败false
    // ==============================================================================
    $redis->rpush('list1','5');
    $redis->rpush('list1','6');
    dd($redis->lgetrange('list1','0','-1'));

    // 列表==============================================================================
    // @10 lpop rpop
    // 描述：返回和移除列表的第(最后)一个元素
    // 参数：key
    // 返回值：成功返回第一个元素的值 ，失败返回false
    // ==============================================================================
    $redis->rpop('list1');
    dd($redis->lgetrange('list1','0','-1'));

    // 列表==============================================================================
    // @11 lsize llen
    // 描述：返回的列表的长度。如果列表不存在或为空，该命令返回0。如果该键不是列表，该命令返回FALSE。
    // 参数：Key
    // 返回值：成功返回数组长度，失败false
    // ==============================================================================
    echoln($redis->lsize('list1'));

    // 列表==============================================================================
    // @12 lget
    // 描述：返回指定键存储在列表中指定的元素。 0第一个元素，1第二个… -1最后一个元素，-2的倒数第二…错误的索引或键不指向列表则返回FALSE。
    // 参数：key index
    // 返回值：成功返回指定元素的值，失败false
    // ==============================================================================
    echoln($redis->lget('list1','-1'));

    // 列表==============================================================================
    // @13 lset
    // 描述：为列表指定的索引赋新的值,若不存在该索引返回false.
    // 参数：key index value
    // 返回值：成功返回true,失败false
    // ==============================================================================
    $redis->lset('list1','-1','7');

    // 列表==============================================================================
    // @14 lgetrange lrange
    // 描述：返回在该区域中的指定键列表中开始到结束存储的指定元素，lGetRange(key, start, end)。0第一个元素，1第二个元素… -1最后一个元素，-2的倒数第二…
    // 参数：key start end
    // 返回值：成功返回查找的值，失败false
    // ==============================================================================
    dd($redis->lgetrange('list1','0','-1'));//array([0]=>"1"[1]=>"3"[2]=>"2"[3]=>"1"[4]=>"7")

    // 列表==============================================================================
    // @14 lremove
    // 描述：从列表中从头部开始移除count个匹配的值。如果count为零，所有匹配的元素都被删除。如果count是负数，内容从尾部开始删除。
    // 参数：key value count
    // 返回值：成功返回删除的个数，失败false
    // ==============================================================================
    $redis->lremove('list1','1',-2);
    dd($redis->lgetrange('list1','0','-1'));













// Set 是无序集合。集合成员是唯一的，这就意味着集合中不能出现重复的数据。！！！注意是无序的

    // Set==============================================================================
    // @15 sadd(sAdd)
    // 描述：为一个Key添加一个值。如果这个值已经在这个Key中，则返回FALSE。
    // 参数：key value
    // 返回值：成功返回true,失败false
    // ==============================================================================
    $redis->sAdd('one1','1');
    $redis->sadd('one1','1');
    $redis->sadd('one1','1');//失败
    $redis->sadd('one1','222');
    dd($redis->sMembers('one1'));

    // Set==============================================================================
    // @16 sremove(sRem)
    // 描述：删除Key中指定的value值
    // 参数：key member
    // 返回值：true or false
    // ==============================================================================
    $redis->sremove('one1','222');
    dd($redis->sMembers('one1'));

    // Set==============================================================================
    // @17 smove(sMove)
    // 描述：将Key1中的value移动到Key2中
    // 参数：srcKey dstKey member
    // 返回值：true or false
    // ==============================================================================
    $redis->sadd('one2','2');
    dd($redis->sMembers('one2'));
    $redis->sMove('one2','one1','2');
    dd($redis->sMembers('one1'));

    // Set==============================================================================
    // @18 scontains(isMember)
    // 描述：检查集合中是否存在指定的值。
    // 参数：key value
    // 返回值：true or false
    // ==============================================================================
    dd($redis->sIsMember('one1','1'));//true

    // Set==============================================================================
    // @19 ssize(sCard)
    // 描述：返回集合中存储值的数量
    // 参数：key
    // 返回值：成功返回数组个数，失败0
    // ==============================================================================
    dd($redis->ssize('one1'));//2
    dd($redis->sCard('one1'));//2

    // Set==============================================================================
    // @20 spop(sPop)
    // 描述：随机移除并返回key中的一个值
    // 参数：key
    // 返回值：成功返回删除的值，失败false
    // ==============================================================================
    dd($redis->spop('one1'));
    dd($redis->sMembers('one1'));

    // Set==============================================================================
    // @21 sRandMember
    // 描述：随机并返回key中的一个值
    // 参数：key count
    // 返回值：成功返回随机值，失败false
    // ==============================================================================
    dd($redis->sRandMember('one1'));//随机一个
    dd($redis->sRandMember('one1',10));//随机十个

    // Set==============================================================================
    // @22 sinter(sInter)
    // 描述：返回一个所有指定键的交集。如果只指定一个键，那么这个命令生成这个集合的成员。如果不存在某个键，则返回FALSE。
    // 参数：key1, key2, keyN
    // 返回值：成功返回数组交集，失败false
    // ==============================================================================
    $redis->sAdd('one2','2','1','3');
    $redis->sAdd('one1','3','2','4');
    dd($redis->sMembers('one1'));
    dd($redis->sMembers('one2'));
    dd($redis->sinter('one1','one2'));

    // Set==============================================================================
    // @23 sinterstore(sInterstore)
    // 描述：执行sInter命令并把结果储存到新建的变量中。
    // 参数：Key: dstkey, the key to store the diff into.Keys: key1, key2… keyN. key1..keyN are intersected as in sInter.
    // 返回值：成功返回，交集的个数，失败false
    // ==============================================================================
    $redis->sInterstore('one3','one1','one2');
    dd($redis->sMembers('one3'));

    // Set==============================================================================
    // @24 sunion(sUnion)
    // 描述：返回一个所有指定键的并集
    // 参数：Keys: key1, key2, … , keyN
    // 返回值：成功返回合并后的集，失败false
    // ==============================================================================
    dd($redis->sUnion('one1','one2'));

    // Set==============================================================================
    // @25 sunionstore(sUnionstore)
    // 描述：执行sunion命令并把结果储存到新建的变量中。
    // 参数：Key: dstkey, the key to store the diff into. Keys: key1, key2… keyN. key1..keyN are intersected as in sInter.
    // 返回值：成功返回，交集的个数，失败false
    // ==============================================================================
    $redis->sUnionstore('one4','one1','one2');
    dd($redis->sMembers('one4'));

    // Set==============================================================================
    // @26 sdiff(sDiff)
    // 描述：返回第一个集合中存在并在其他所有集合中不存在的结果
    // 参数：Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis.
    // 返回值：成功返回数组，失败false
    // ==============================================================================
    dd($redis->sMembers('one1'));
    dd($redis->sMembers('one2'));
    dd($redis->sDiff('one1','one2'));

    // Set==============================================================================
    // @27 sdiffstore(sDiffstore)
    // 描述：执行sdiff命令并把结果储存到新建的变量中。
    // 参数：Key: dstkey, the key to store the diff into.Keys: key1, key2, … , keyN: Any number of keys corresponding to sets in redis
    // 返回值：成功返回数字，失败false
    // ==============================================================================
    $redis->sDiffstore('one5','one1','one2');
    dd($redis->sMembers('one5'));






















//Sorted-set（有序集合）!!!有序   一个单元主要有三个属性组成  rank(序号 0,1,2等) score(可以是小数点或整数) 还有键(唯一)

  //zadd
  //   Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。（分数值可以是整数值或双精度浮点数。）
  // （1）如果某个成员已经是有序集的成员，那么更新这个成员的分数值，并通过重新插入这个成员元素，来保证该成员在正确的位置上。
  // （2）如果有序集合 key 不存在，则创建一个空的有序集并执行 ZADD 操作。
  // （3）当 key 存在但不是有序集类型时，返回一个错误。

  $redis -> zAdd('myset',0,'hello');  // hello是键,0是值,键是唯一的,值可以重复
  $redis -> zAdd('myset',1,'world');
  $redis -> zAdd('myset',1,'foo');
  $redis -> zAdd('myset',2,'hi');
  $redis -> zAdd('myset',2.5,'welcome');

  dd($redis -> zRange('myset',0,-1));//输出键数组
  dd($redis -> zRange('myset',0,-1,'withScores')); //withScores 可以输出值

  //zRem(zremove)删除元素
  $redis->zRem('myset','hello');
  dd($redis -> zRange('myset',0,-1,'withScores'));

  //zCard(zsize) 返回长度
  dd($redis->zCard('myset'));

  //zCount 返回值区间之间的数量
  dd($redis->zRange('myset',0,'-1'));
  dd($redis->zCount('myset',0,1));//包括 0和1

  //zscore 根据键获取值
  dd($redis->zScore('myset','welcome'));

  //zincrby 对键值进行运算
  dd($redis -> zRange('myset',0,-1,'withScores'));
  $redis->zIncrby('myset','-1.2','welcome');

  //查询指定范围的集合 根据值从小到大排列
  dd($redis -> zRange('myset',0,-1,'withScores'));

  //查询指定范围的集合 根据值从大到小排列
  dd($redis->zRevRange('myset',0,-1,'withScores'));

  //查询值指定范围内的集合 根据值从小到大排列
  dd($redis->zRangeByScore('myset',0,3));

  //查询值指定范围内的集合 根据值从大到小排列
  dd($redis->zRevRangeByScore('myset',3,0));

  //删除值区间内的元素
  $redis->zRemRangeByScore('myset',0,1);
  dd($redis->zrange('myset',0,-1,'withScores'));

  // 交集 zInter 键相同的会相加两个值
  $redis->zAdd('myset1','12','moxi');
  $redis->zAdd('myset1','1.3','sawa');
  $redis->zAdd('myset1','2.4','hi');
  $redis->zInter('myset2',array('myset1','myset'));
  dd($redis->zrange('myset2',0,-1,'withScores'));

  // 并集 zUnion 键相同的会相加两个值
  $redis->zUnion('myset3',array('myset','myset1'));
  dd($redis->zRange('myset3',0,-1,'withScores'));

  //zRank 根据值从小到大获取键的序号  排名从零开始
  dd($redis->zRANK('myset3','sawa'));

  //ZRevRank 根据值从大到小获取键的序号   排名从零开始
  dd($redis->zRevRANK('myset3','sawa'));

  //根据键值的范围删除
  dd($redis->zrange('myset3',0,-1));
  $redis->zRemRangeByRank('myset3',0,0);
  dd($redis->zrange('myset3',0,-1));
















  //hash 可以用于存储对象

  //hset('myhash','key1','value');//设置
  //hget('myhash','key1');//获取
  //hmset('myhash',array('key1'=>'value1','key2'=>'value2','key3'=>'value3'));//批量设置
  //hmget('myhash',array('key1','key2'));//批量获取
  //hgetall('myhash');//获取所有
  //$redis -> del('myhash','key1');//删除

?>
